package br.elite.dao.hbdao;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.PersistenceException;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;

import br.elite.dao.GenericDAO;
import br.elite.dao.UsuarioDAO;
import br.elite.domain.Usuario;

/**
 * @author antonio 05-04-2011
 *
 */

@Stateless
public class UsuarioHBDAO extends GenericDAO implements UsuarioDAO {

	@Override
	@SuppressWarnings("unchecked")
	public List<Usuario> buscar(Usuario usuario) throws PersistenceException {
		try {
			super.getSession().beginTransaction();
			Criteria crit = super.getSession().createCriteria(Usuario.class);
			if (usuario.getNumeroOAB() != null) {
				crit.add(Restrictions.eq("numeroOAB", usuario.getNumeroOAB()));
			} else {
				crit.add(Restrictions.like("nome", "%" + usuario.getNome() + "%"));
			}
			return crit.list();
		} catch (Exception e) {
			e.printStackTrace();
			throw new PersistenceException(e);
		} finally {
			super.getSession().close();
		}
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<Usuario> buscarTodos() throws PersistenceException {
		try {
			
			getSession().beginTransaction();
			StringBuilder hql = new StringBuilder("select new ");
			hql.append(Usuario.class.getName());
			hql.append(" ( ");
			hql.append(" c.numero, ");
			hql.append(" c.nome, ");
			hql.append(" c.numeroOAB ");
			hql.append(" ) from ").append(Usuario.class.getName()).append(" c ");
			hql.append(" order by c.nome asc");
			
			Query q = getSession().createQuery(hql.toString());
			return q.list();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new PersistenceException(e);
		} finally {
			super.getSession().close();
		}
	}

	@Override
	public void salvar(Usuario usuario) throws PersistenceException {
		try {

			System.out.println("UsuarioHBDAO.salvar()");
			
//			if (usuario.getNumero() == null) {		
				
				// valida se um ja existe um usuario com o mesmo numero da OAB. 
				getSession().beginTransaction();
				
//				StringBuilder hql = new StringBuilder(" select count(*) from ")
//						.append(Usuario.class.getName());
//				hql.append(" c ").append(" where c.numero_oab ='").append(usuario.getNumeroOAB()).append("'");
//				Query q = getSession().createQuery(hql.toString());
//				String result = q.uniqueResult().toString();
//				
//				if (result != null && !result.equals("0")) {
//					throw new PersistenceException("Cliente j\u00E1 cadastrado com este n\u00FAmeroOAB!");
//				}
				
				Long id = this.proximoId(Usuario.class.getName(), "numero");
				
				usuario.setNumero(id);
				
				super.salvarOuAtualizar(usuario);
				
//			} else {
//				
//				// valida se um ja existe um usuario com o mesmo numero da OAB. 
//				getSession().beginTransaction();
//				
//				StringBuilder hql = new StringBuilder(" select c.numero from ")
//						.append(Usuario.class.getName());
//				hql.append(" c ").append(" where c.numero_oab ='").append(usuario.getNumeroOAB()).append("'");
//				Query q = getSession().createQuery(hql.toString());
//				Long result = (Long) q.uniqueResult();
//				
//				if (result != null && !result.equals(usuario.getNumero())) {
//					throw new PersistenceException("Usuario j\u00E1 cadastrado com este n\u00FAmeroOAB!");
//				}
//				super.atualiza(usuario);
//			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new PersistenceException(e);
		}
	}
	
	@Override
	public Usuario buscarUsuarioPorCodigo(Long id) throws PersistenceException {
		try {
			return (Usuario) super.buscarPorId(id, "numero", Usuario.class.getName());
		} catch (Exception e) {
			e.printStackTrace();
			throw new PersistenceException(e);
		}
	}
	
	@Override
	public void deletar(Usuario usuario) throws PersistenceException{
		try {
			super.excluir(usuario);
		} catch (HibernateException e) {
			e.printStackTrace();
			throw new PersistenceException(e);
		}
	}
	
}
